"""
给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ，就返回 0。
假设环境不允许存储 64 位整数（有符号或无符号）。

Given a signed 32-bit integer x, return x with its digits reversed. 
If reversing x causes the value to go outside the signed 32-bit integer range [-231, 231 - 1], then return 0.
Assume the environment does not allow you to store 64-bit integers (signed or unsigned)

"""

class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        int类型4字节最大值为2**31-1=2147483647, 最小值为-2**31=-2147483648
        
        一般做法是将数字转换为字符串，反转再转换为int
        这样的做法在很多语言中会出现溢出的情况导致结果错误
        
        本解法：
            使用x%10获取每轮的个位数，使用//将x降一位,停止条件就是x==0
            设置INT_MAX = 2147483647//10
            分为三次判断：
                第一次：判断当前反转的数与INT_MAX的大小，如果比INT_MAX大，那么当前数再乘以10不管怎么样都是大于INT_MAX，就不需要继续了直接返回0
                第二次：若当前反转数等于INT_MAX时，要判断一下模运算获取的这个数是否大于7，若大于7则 当前反转数*10之后+modValue 一定是大于 INT_MAX 
                第三次：当前反转数小于INT_MAX，那 当前反转数*10之后+modValue 一定小于 INT_MAX
        """
        res, flag = 0, 1
        if x<0:
            flag, x = 0, -x
        INT_MAX = (2**31 - 1) // 10
        while x!=0:
            if res > INT_MAX:
                return 0
            elif res == INT_MAX:
                modValue = x % 10
                if modValue <= 7:
                    res = res * 10 + modValue
                    x //= 10
            else:
                modValue = x % 10  
                res = res * 10  + modValue
                x //= 10
        if flag:
            return res
        return -res
    
    def reverseSimple(x):
        """
        :type x: int
        :rtype: int
        python的简单方法，因为并没有限制整数大小，所以可以直接进行字符串反转和判断。
        """
        string = str(x)
        res = 0
        if string[0] == '-':
            res = int('-'+string[1:][::-1])
        else:
            res = int(string[::-1])
        if res < -2**31 or res > 2**31-1:
            return 0
        return res